package com.hp.nacos.config.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hp.nacos.config.dao.UserMapper;
import com.hp.nacos.config.entity.po.User;
import com.hp.nacos.config.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.annotation.Recover;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author dongxing
 * @since 2019-05-19
 */
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {


    /**
     * 重试测试
     * <p>
     * - value: 抛出指定异常才会重试
     * - include: 和 value 一样，默认为空，当 exclude 也为 空时，默认所有异常
     * - exclude: 指定不处理的异常
     * - maxAttempts: 最大重试次数，默认为 3次 （包含 第一次失败）
     * - backoff: 重试等待策略， 默认使用 @Backoff。 @Backoff 的 value 默认为 1000L
     * <p>
     * 我们设置为 2000L， multiplier（指定延迟倍数），默认为 0 ， 表示固定暂停为 1秒后 进行重试
     *
     * 如果把 multiplier 设置为 1.5 ， 则 第一次重试为 2秒，第二次重试 为 3秒，第 三次 重试为 4.5 秒
     *
     * 如果不指定 listeners ，则会 将 所有的 RetryListener 执行一遍
     *
     */
    @Override
    //@Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000,multiplier = 1.5),recover = "recover1",listeners = {"retryListener2"})
    //@Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000,multiplier = 1.5))
    public void retryTest(int code,String name) {
        log.info("test retry, 时间: [{}]", LocalDateTime.now());
        //throw new Exception("出错了");

        int i = 1 / 0;

        log.info("test retry 成功调用!");
    }

    /**
     * 用于 处理  @Retryable 异常
     *
     * @param e    e
     * @param code 代码
     * @param str2 str2
     */
    @Recover
    public void recover2(Exception e, int code, String str2) {
        log.info("test retry 调用 异常了! 方法名: recover2");
    }

    /**
     * 用于 处理  @Retryable 异常
     *
     * @param e    e
     * @param code 代码
     * @param str2 str2
     */
    @Recover
    public void recover1(Exception e, int code, String str2) {
        log.info("test retry 调用 异常了! 方法名: recover1");
    }






}
